package Threads.extra;


//看操作系统上视频看到的，peterson算法
//无锁实现对临界区的互斥访问
//谦让式
public class Peterson {
    static  volatile int[] flags=new int[2];//这里需要volatile，保证flags在线程间的可见性

    static int turn=0;

    public static void start(int flag_index) throws InterruptedException {
        flags[flag_index]=1;//举手

        turn=(flag_index+1)%2;//贴标签（对方的）

        //代表对方进入了临界区，自己会一直卡在这个循环
        while (flags[(flag_index+1)%2]==1&&turn==(flag_index+1)%2){}

        //进入临界区
        Thread.sleep(1000);
        System.out.println("I am "+flag_index+"-----RUNNING");

        //退出后，把标记设为0
        flags[flag_index]=0;
    }

    public static void main(String[] args) {
        Thread t1=new Thread(()->{
            while (true) {
                try {
                    Peterson.start(0);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"t1");

        Thread t2=new Thread(()->{
            while (true) {
                try {
                    Peterson.start(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"t2");

        t1.start();
        t2.start();
    }
}
